package com.ruoyi.report_sn.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.ruoyi.common.utils.BigDecimalUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.syrw.annotation.ComputeReportResult;
import com.ruoyi.syrw.annotation.FIllBasicInfo;
import com.ruoyi.syrw.annotation.FIllBasicInfoForTaiZhang;
import com.ruoyi.report_tg.domain.TgsybgBaDetail;
import com.ruoyi.report_tg.domain.vo.TgsybgBaDetailVo;
import com.ruoyi.report_tg.mapper.TgsybgBaDetailMapper;
import com.ruoyi.sycs.service.IBiQualificationService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.ruoyi.report_sn.domain.bo.SnsybgBsInfoBo;
import com.ruoyi.report_sn.domain.vo.SnsybgBsInfoVo;
import com.ruoyi.report_sn.domain.SnsybgBsInfo;
import com.ruoyi.report_sn.mapper.SnsybgBsInfoMapper;
import com.ruoyi.report_sn.service.ISnsybgBsInfoService;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;

/**
 * 水泥试验报告Service业务层处理
 *
 * @author zyb
 * @date 2024-06-11
 */
@RequiredArgsConstructor
@Service
public class SnsybgBsInfoServiceImpl implements ISnsybgBsInfoService {

    private final SnsybgBsInfoMapper baseMapper;
    private final TgsybgBaDetailMapper detailMapper;

    private final IBiQualificationService biQualificationService;

    private static final Long[] keys = {72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L};

    /**
     * 查询水泥试验报告
     */
    @Override
    @FIllBasicInfo
    public SnsybgBsInfoVo queryById(Long excelId){
        SnsybgBsInfoVo snsybgBsInfoVo = baseMapper.selectVoById(excelId);
        // 查询detail
        List<TgsybgBaDetailVo> baDetailVos = detailMapper.selectVoList(new LambdaQueryWrapper<TgsybgBaDetail>()
            .eq(TgsybgBaDetail::getExcelId, excelId));
        baDetailVos.forEach(v->{
            v.setQualInfo(biQualificationService.queryById(v.getQualId()));
        });
        // 格式化 技术指标
        biQualificationService.compute(baDetailVos);
        // 转换成map形式
        Map<Long, TgsybgBaDetailVo> collect = baDetailVos.stream().collect(Collectors.toMap(TgsybgBaDetailVo::getQualId, v -> {
            return v;
        }));
        snsybgBsInfoVo.setBaDetailVos(collect);
        return snsybgBsInfoVo;
    }

    @Override
    @FIllBasicInfoForTaiZhang
    public SnsybgBsInfoVo queryByIdForTaizhang(Long excelId) {
        SnsybgBsInfoVo snsybgBsInfoVo = baseMapper.selectVoById(excelId);
        // 查询detail
        List<TgsybgBaDetailVo> baDetailVos = detailMapper.selectVoList(new LambdaQueryWrapper<TgsybgBaDetail>()
            .eq(TgsybgBaDetail::getExcelId, excelId));
        baDetailVos.forEach(v->{
            v.setQualInfo(biQualificationService.queryById(v.getQualId()));
        });
        // 格式化 技术指标
        biQualificationService.compute(baDetailVos);
        // 转换成map形式
        Map<Long, TgsybgBaDetailVo> collect = baDetailVos.stream().collect(Collectors.toMap(TgsybgBaDetailVo::getQualId, v -> {
            return v;
        }));

        // 结果明细台账使用
        if (CollUtil.isNotEmpty(collect)) {
            snsybgBsInfoVo.setKey72(collect.get(72L) != null ? BigDecimalUtil.toString(collect.get(72L).getJiancjg()) : null);
            snsybgBsInfoVo.setKey73(collect.get(73L) != null ? BigDecimalUtil.toString(collect.get(73L).getJiancjg()) : null);
            snsybgBsInfoVo.setKey74(collect.get(74L) != null ? BigDecimalUtil.toString(collect.get(74L).getJiancjg()) : null);
            snsybgBsInfoVo.setKey75(collect.get(75L) != null ? BigDecimalUtil.toString(collect.get(75L).getJiancjg()) : null);
            snsybgBsInfoVo.setKey76(collect.get(76L) != null ? BigDecimalUtil.toString(collect.get(76L).getJiancjg()) : null);
            snsybgBsInfoVo.setKey77(collect.get(77L) != null ? BigDecimalUtil.toString(collect.get(77L).getJiancjg()) : null);
            snsybgBsInfoVo.setKey78(collect.get(78L) != null ? BigDecimalUtil.toString(collect.get(78L).getJiancjg()) : null);
            snsybgBsInfoVo.setKey79(collect.get(79L) != null ? BigDecimalUtil.toString(collect.get(79L).getJiancjg()) : null);
            snsybgBsInfoVo.setKey80(collect.get(80L) != null ? BigDecimalUtil.toString(collect.get(80L).getJiancjg()) : null);
            snsybgBsInfoVo.setKey81(collect.get(81L) != null ? BigDecimalUtil.toString(collect.get(81L).getJiancjg()) : null);
            snsybgBsInfoVo.setKey82(collect.get(82L) != null ? BigDecimalUtil.toString(collect.get(82L).getJiancjg()) : null);
            snsybgBsInfoVo.setKey83(collect.get(83L) != null ? BigDecimalUtil.toString(collect.get(83L).getJiancjg()) : null);
            snsybgBsInfoVo.setKey84(collect.get(84L) != null ? BigDecimalUtil.toString(collect.get(84L).getJiancjg()) : null);
        }
        snsybgBsInfoVo.setBaDetailVos(collect);
        return snsybgBsInfoVo;
    }

    /**
     * 查询水泥试验报告列表
     */
    @Override
    public TableDataInfo<SnsybgBsInfoVo> queryPageList(SnsybgBsInfoBo bo, PageQuery pageQuery) {
        LambdaQueryWrapper<SnsybgBsInfo> lqw = buildQueryWrapper(bo);
        Page<SnsybgBsInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
        return TableDataInfo.build(result);
    }

    /**
     * 查询水泥试验报告列表
     */
    @Override
    public List<SnsybgBsInfoVo> queryList(SnsybgBsInfoBo bo) {
        LambdaQueryWrapper<SnsybgBsInfo> lqw = buildQueryWrapper(bo);
        return baseMapper.selectVoList(lqw);
    }

    private LambdaQueryWrapper<SnsybgBsInfo> buildQueryWrapper(SnsybgBsInfoBo bo) {
        Map<String, Object> params = bo.getParams();
        LambdaQueryWrapper<SnsybgBsInfo> lqw = Wrappers.lambdaQuery();
        lqw.eq(bo.getTotalPage() != null, SnsybgBsInfo::getTotalPage, bo.getTotalPage());
        lqw.eq(bo.getPage() != null, SnsybgBsInfo::getPage, bo.getPage());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancdwmc()), SnsybgBsInfo::getJiancdwmc, bo.getJiancdwmc());
        lqw.eq(StringUtils.isNotBlank(bo.getBaogbh()), SnsybgBsInfo::getBaogbh, bo.getBaogbh());
        lqw.eq(StringUtils.isNotBlank(bo.getShigwtdw()), SnsybgBsInfo::getShigwtdw, bo.getShigwtdw());
        lqw.eq(StringUtils.isNotBlank(bo.getGongcmc()), SnsybgBsInfo::getGongcmc, bo.getGongcmc());
        lqw.eq(StringUtils.isNotBlank(bo.getGongcbwyt()), SnsybgBsInfo::getGongcbwyt, bo.getGongcbwyt());
        lqw.eq(StringUtils.isNotBlank(bo.getYangpmc()), SnsybgBsInfo::getYangpmc, bo.getYangpmc());
        lqw.eq(StringUtils.isNotBlank(bo.getYangpbh()), SnsybgBsInfo::getYangpbh, bo.getYangpbh());
        lqw.eq(StringUtils.isNotBlank(bo.getYangpsl()), SnsybgBsInfo::getYangpsl, bo.getYangpsl());
        lqw.eq(StringUtils.isNotBlank(bo.getYangpzt()), SnsybgBsInfo::getYangpzt, bo.getYangpzt());
        lqw.eq(StringUtils.isNotBlank(bo.getYangpsj()), SnsybgBsInfo::getYangpsj, bo.getYangpsj());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancyj()), SnsybgBsInfo::getJiancyj, bo.getJiancyj());
        lqw.eq(StringUtils.isNotBlank(bo.getPandyj()), SnsybgBsInfo::getPandyj, bo.getPandyj());
        lqw.eq(StringUtils.isNotBlank(bo.getZhuyyqsbmcjbh()), SnsybgBsInfo::getZhuyyqsbmcjbh, bo.getZhuyyqsbmcjbh());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbmd()), SnsybgBsInfo::getJiszbmd, bo.getJiszbmd());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgmd()), SnsybgBsInfo::getJiancjgmd, bo.getJiancjgmd());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdmd()), SnsybgBsInfo::getJiegpdmd, bo.getJiegpdmd());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbbbmj()), SnsybgBsInfo::getJiszbbbmj, bo.getJiszbbbmj());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgbbmj()), SnsybgBsInfo::getJiancjgbbmj, bo.getJiancjgbbmj());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdbbmj()), SnsybgBsInfo::getJiegpdbbmj, bo.getJiegpdbbmj());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbysl()), SnsybgBsInfo::getJiszbysl, bo.getJiszbysl());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgysl()), SnsybgBsInfo::getJiancjgysl, bo.getJiancjgysl());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdysl()), SnsybgBsInfo::getJiegpdysl, bo.getJiegpdysl());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbcn()), SnsybgBsInfo::getJiszbcn, bo.getJiszbcn());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgcn()), SnsybgBsInfo::getJiancjgcn, bo.getJiancjgcn());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdcn()), SnsybgBsInfo::getJiegpdcn, bo.getJiegpdcn());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbzn()), SnsybgBsInfo::getJiszbzn, bo.getJiszbzn());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgzn()), SnsybgBsInfo::getJiancjgzn, bo.getJiancjgzn());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdzn()), SnsybgBsInfo::getJiegpdzn, bo.getJiegpdzn());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbndxbsf()), SnsybgBsInfo::getJiszbndxbsf, bo.getJiszbndxbsf());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgndxbsf()), SnsybgBsInfo::getJiancjgndxbsf, bo.getJiancjgndxbsf());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdndxbsf()), SnsybgBsInfo::getJiegpdndxbsf, bo.getJiegpdndxbsf());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbndxlsf()), SnsybgBsInfo::getJiszbndxlsf, bo.getJiszbndxlsf());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgndxlsf()), SnsybgBsInfo::getJiancjgndxlsf, bo.getJiancjgndxlsf());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdndxlsf()), SnsybgBsInfo::getJiegpdndxlsf, bo.getJiegpdndxlsf());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbldd()), SnsybgBsInfo::getJiszbldd, bo.getJiszbldd());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgldd()), SnsybgBsInfo::getJiancjgldd, bo.getJiancjgldd());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdldd()), SnsybgBsInfo::getJiegpdldd, bo.getJiegpdldd());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbxd()), SnsybgBsInfo::getJiszbxd, bo.getJiszbxd());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgxd()), SnsybgBsInfo::getJiancjgxd, bo.getJiancjgxd());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdxd()), SnsybgBsInfo::getJiegpdxd, bo.getJiegpdxd());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbkz3d()), SnsybgBsInfo::getJiszbkz3d, bo.getJiszbkz3d());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgkz3ddz1()), SnsybgBsInfo::getJiancjgkz3ddz1, bo.getJiancjgkz3ddz1());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgkz3ddz2()), SnsybgBsInfo::getJiancjgkz3ddz2, bo.getJiancjgkz3ddz2());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgkz3ddz3()), SnsybgBsInfo::getJiancjgkz3ddz3, bo.getJiancjgkz3ddz3());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgkz3dpjz()), SnsybgBsInfo::getJiancjgkz3dpjz, bo.getJiancjgkz3dpjz());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdkz3d()), SnsybgBsInfo::getJiegpdkz3d, bo.getJiegpdkz3d());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbkz28d()), SnsybgBsInfo::getJiszbkz28d, bo.getJiszbkz28d());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgkz28ddz1()), SnsybgBsInfo::getJiancjgkz28ddz1, bo.getJiancjgkz28ddz1());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgkz28ddz2()), SnsybgBsInfo::getJiancjgkz28ddz2, bo.getJiancjgkz28ddz2());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgkz28ddz3()), SnsybgBsInfo::getJiancjgkz28ddz3, bo.getJiancjgkz28ddz3());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgkz28dpjz()), SnsybgBsInfo::getJiancjgkz28dpjz, bo.getJiancjgkz28dpjz());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdkz28d()), SnsybgBsInfo::getJiegpdkz28d, bo.getJiegpdkz28d());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbky3d()), SnsybgBsInfo::getJiszbky3d, bo.getJiszbky3d());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky3ddz1()), SnsybgBsInfo::getJiancjgky3ddz1, bo.getJiancjgky3ddz1());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky3ddz2()), SnsybgBsInfo::getJiancjgky3ddz2, bo.getJiancjgky3ddz2());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky3ddz3()), SnsybgBsInfo::getJiancjgky3ddz3, bo.getJiancjgky3ddz3());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky3ddz4()), SnsybgBsInfo::getJiancjgky3ddz4, bo.getJiancjgky3ddz4());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky3ddz5()), SnsybgBsInfo::getJiancjgky3ddz5, bo.getJiancjgky3ddz5());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky3ddz6()), SnsybgBsInfo::getJiancjgky3ddz6, bo.getJiancjgky3ddz6());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky3dpjz()), SnsybgBsInfo::getJiancjgky3dpjz, bo.getJiancjgky3dpjz());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdky3d()), SnsybgBsInfo::getJiegpdky3d, bo.getJiegpdky3d());
        lqw.eq(StringUtils.isNotBlank(bo.getJiszbky28d()), SnsybgBsInfo::getJiszbky28d, bo.getJiszbky28d());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky28ddz1()), SnsybgBsInfo::getJiancjgky28ddz1, bo.getJiancjgky28ddz1());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky28ddz2()), SnsybgBsInfo::getJiancjgky28ddz2, bo.getJiancjgky28ddz2());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky28ddz3()), SnsybgBsInfo::getJiancjgky28ddz3, bo.getJiancjgky28ddz3());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky28ddz4()), SnsybgBsInfo::getJiancjgky28ddz4, bo.getJiancjgky28ddz4());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky28ddz5()), SnsybgBsInfo::getJiancjgky28ddz5, bo.getJiancjgky28ddz5());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky28ddz6()), SnsybgBsInfo::getJiancjgky28ddz6, bo.getJiancjgky28ddz6());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjgky28dpjz()), SnsybgBsInfo::getJiancjgky28dpjz, bo.getJiancjgky28dpjz());
        lqw.eq(StringUtils.isNotBlank(bo.getJiegpdky28d()), SnsybgBsInfo::getJiegpdky28d, bo.getJiegpdky28d());
        lqw.eq(StringUtils.isNotBlank(bo.getJiancjl()), SnsybgBsInfo::getJiancjl, bo.getJiancjl());
        lqw.eq(StringUtils.isNotBlank(bo.getFujsm()), SnsybgBsInfo::getFujsm, bo.getFujsm());
        lqw.eq(StringUtils.isNotBlank(bo.getJianc()), SnsybgBsInfo::getJianc, bo.getJianc());
        lqw.eq(StringUtils.isNotBlank(bo.getJil()), SnsybgBsInfo::getJil, bo.getJil());
        lqw.eq(StringUtils.isNotBlank(bo.getFuh()), SnsybgBsInfo::getFuh, bo.getFuh());
        lqw.eq(StringUtils.isNotBlank(bo.getRiq()), SnsybgBsInfo::getRiq, bo.getRiq());
        return lqw;
    }

    /**
     * 新增水泥试验报告
     */
    @Override
    @DSTransactional
    public Boolean insertByBo(SnsybgBsInfoBo bo) {
        SnsybgBsInfo add = BeanUtil.toBean(bo, SnsybgBsInfo.class);
        validEntityBeforeSave(add);
        boolean flag = baseMapper.insert(add) > 0;
        if (flag) {
            bo.setExcelId(add.getExcelId());
            // 新增详细 多个keys
            ArrayList<TgsybgBaDetail> details = new ArrayList<>(13);
            for (Long key : keys) {
                details.add(new TgsybgBaDetail(add.getExcelId(), key));
            }
            detailMapper.insertBatch(details);
        }
        return flag;
    }

    /**
     * 修改水泥试验报告
     */
    @Override
    @DSTransactional
    @ComputeReportResult
    public Boolean updateByBo(SnsybgBsInfoBo bo) {
        // 增加对 是否合格 的填充
        fillExcelResult(bo);
        SnsybgBsInfo update = BeanUtil.toBean(bo, SnsybgBsInfo.class);
        validEntityBeforeSave(update);
        boolean flag = baseMapper.updateById(update) > 0;
        if (flag) {
            detailMapper.updateBatchById(BeanUtil.copyToList(bo.getBaDetailVos().values(), TgsybgBaDetail.class));
        }
        return flag;
    }

    private void fillExcelResult(SnsybgBsInfoBo bo) {
        if (CollUtil.isNotEmpty(bo.getBaDetailVos())) {
            for (TgsybgBaDetailVo detailVo : bo.getBaDetailVos().values()) {
                if ("不符合".equals(detailVo.getJiegpd())) {
                    bo.setExcelResult(2);
                    return;
                }
            }
            bo.setExcelResult(1);
        }
        bo.setExcelResult(0);
    }

    public boolean isWell(Long excelId) {
        return baseMapper.selectVoById(excelId).getExcelResult() != 2;
    }

    /**
     * 保存前的数据校验
     */
    private void validEntityBeforeSave(SnsybgBsInfo entity){
        //TODO 做一些数据校验,如唯一约束
    }

    /**
     * 批量删除水泥试验报告
     */
    @Override
    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
        if(isValid){
            //TODO 做一些业务上的校验,判断是否需要校验
        }
        return baseMapper.deleteBatchIds(ids) > 0;
    }

    @Override
    public SnsybgBsInfoVo jcjl(SnsybgBsInfoVo vo) {
        StringBuilder result = new StringBuilder("检测结论：经检测，该水泥");
        boolean haveShicz = false;
        for (TgsybgBaDetailVo detailVo : vo.getBaDetailVos().values()) {
            if ("实测值".equals(detailVo.getJiegpd())) {
                result.append(detailVo.getQualName()).append("为").append(detailVo.getJiancjg()).append(detailVo.getQualUnit()).append("，");
                haveShicz = true;
            }
        }
        if (haveShicz) {
            result.append("其他指标符合");
        } else {
            result.append("所检指标符合");
        }
        result.append(vo.getPandyj()).append("《通用硅酸盐水泥》中P·52.5技术要求。");
        vo.setJiancjl(result.toString());
        return vo;
    }
}
